#pragma once

#include <iostream>
#include <string>
#include <ctemplate/template.h>

#include "oj_model.hpp"

namespace ns_view
{
    using namespace ns_model;

    //模板路径：指定存放了HTML模板文件目录
    const std::string template_path="./template_html/";

    class View
    {
    public:
        View(){}
        ~View(){}
    
    public:
        // 渲染题目列表
        // 参数:
        //     problems：一个包含所有题目信息的列表
        //                 每个 Problem 结构体包含题目的编号、标题、难度等信息
        //     html：输出参数，存放生成的 HTML 代码
        void AllExpandHtml(const std::vector<struct Problem> &problems, std::string *html)
        {
            //1.形成模板路径
            std::string src_html=template_path+"all_problems.html";
            //2.加载模板文件
            //创建一个字典对象root，用于存储题目信息
            ctemplate::TemplateDictionary root("all_problems");
            //每个题目信息都会被加入到problems_list中,这部分在模板文件中会被重新渲染
            for(const auto &problem:problems)
            {
                ctemplate::TemplateDictionary *problem_dict=root.AddSectionDictionary("problems_list");
                problem_dict->SetValue("id",problem.id);//题目编号
                problem_dict->SetValue("title",problem.title);//题目标题
                problem_dict->SetValue("star",problem.star);//题目难度
            }

            //3.加载被渲染的html模板
            ctemplate::Template *st=ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);

            //4.渲染html模板
            st->Expand(html,&root);
        }

        //渲染单个题目的详细页面
        void OneExpandHtml(const struct Problem &problem, std::string *html)
        {
            //1.形成模板路径
            std::string src_html=template_path+"one_problem.html";
            //2.加载模板文件
            ctemplate::TemplateDictionary root("one_problem");
            root.SetValue("id",problem.id);
            root.SetValue("title",problem.title);
            root.SetValue("star",problem.star);
            root.SetValue("desc",problem.desc);
            //sroot.SetValue("pre_code",problem.header);//预设接口代码
            //解决ctemplate忽略头文件尖括号问题
            std::string pre_code=StringUtil::EscapeHtml(problem.header);
            root.SetValue("pre_code",pre_code);//预设接口代码
            //3.加载被渲染的html模板
            ctemplate::Template *st=ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);
            //4.渲染html模板
            st->Expand(html,&root);
        }
    };
}